Swift3.0を学ぶにあたって知っておきたい基礎文法(後編)
Swift3.0を学ぶにあたって、言語的に必要そうな部分を広く浅く一覧した記事の後編です。
一ヶ月以上空いてしまいましたが、前編はこちらになります。
Array
配列
// 'Int'の配列 let oddNumbers = [1, 3, 5, 7, 9, 11, 13, 15] // 'String'の配列 let fruits = ["apple", "orange", "grape"]
空の配列の宣言は下記のように書ける
var emptyDoubles: [Double] = [] var emptyFloats: Array<Float> = Array()
Dictionary
キーと値のペアのリスト
let fruitPrices = ["apple": 100, "orange": 200, "grape": 300]
キーと値のペアなしで辞書を作成するには、[:]を使う
var emptyDict: [String: String] = [:]
タプル
()で囲った,カンマ区切りのリスト。 配列と違って異なる型の値をまとめることができるけど、要素を追加したり削除することはできない。 宣言した順に、0, 1... で値を取得出来る
let sample = ("apple", 100, 5.3) print(sample.1) // 100
また、ラベルをつけることが出来る
let sample = (name: "apple", price: 100, rate:5.3) print(square.name) // "apple" print(square.price) // 100 print(square.rate) // 5.3
if文
()が不要 基本的に他の言語と変わらない。
if 条件 { } else if 条件 { } else { }
範囲を指定する場合、以下のような記述も出来る。
if statusCode >= 200 && statusCode <= 299 { // 処理 } ↓ if case 200 ... 299 = statusCode { // 処理 }
ループ
for
for-in Loop形式。これも基本的に他の言語と変わらない。
for i in 1...3 { // 1,2,3 print(i) } let fruits = ["apple", "orange", "grape"] for fruit in fruits { print(fruit) } let fruitPrices = ["apple": 100, "orange": 200, "grape": 300] for (name,price) in fruitPrices { print("\(name)\(price)") }
while
条件になるまでループする形式。最初に判定するケースと後で判定するケースの2パターン。
while !endOfFile { readLine() } repeat { performTask() } while tasksRemaining > 0
function
関数。基本的な文法のサンプルは下記のとおり。
// 引数戻り値なし func sample() { } // 引数あり func sample(id :Int) { } // 戻り値あり func sample() -> Bool } return true } // 引数・戻り値あり func sample(name: String) -> String { return "" }
デフォルト引数について(Swift3.0からの変更点)
func defaultArguments(a: Int = 0, b: Int = 0, c: Int = 0) {} defaultArguments(a: 0) // ok defaultArguments(b: 1) // ok defaultArguments(c: 2) // ok defaultArguments(a: 1, c: 2) // ok defaultArguments(b: 1, c: 2) // ok defaultArguments(c: 1, b: 2) // error
クラス
他の言語と大差ないと思う。参照型
class className { }
サブクラス
別のクラスを継承する。
class className : SuperClassName { }
※ サブクラスの可否についてはアクセス修飾子による
override
オーバーライドはoverrideを付ける。
class sampleViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } }
※ オーバーライドの可否についてはアクセス修飾子による
アクセス修飾子
クラスやプロパティやメソッドへのアクセス範囲
Swift3では、以下の種類がある
open | モジュール外からもアクセスできる。 一番ゆるいアクセスコントロール。 |
public | モジュール外からもアクセスできる。 サブクラス化されない。 overrideできない。 |
internal | モジュール内ならアクセスできる。 何も書かないとコレになる。(デフォルト) |
fileprivate | 文字通りファイル内ならアクセスできる。 |
private | クラスなど宣言内でしかアクセスできない。 |
構造体 struct
値型。
定義は下記
struct StructName { let property: Type func function() { } }
[参考] 構造体とクラスの使い分けについて
Swiftのクラスと構造体の使い分けについてのメモ|Qiita
Enum 列挙型
関連する値を型としてまとめたもの。
enum Alignment { case left, right } let textAlignment = Alignment.left switch textAlignment { case .left: print("Lean to the left") case .right: print("Lean to the right") }
列挙型にメソッドを定義することも出来ます。
enum Alignment { case left, right func arrow() -> String { switch(self) { case .left: return "←" case .right: return "→" } } } let alignment = Alignment.right print(alignment.arrow()) // →
Protocol
Javaでいうところのインターフェースのように、クラスや構造体に実装するプロパティやメソッドを定義する。
文法は protocol プロトコル名 {} と記述する。
protocol SomeProtocol { func someMethod() }
protocolを利用するには:の後に指定する。複数の場合は,で区切って記述する。
struct SomeStructure: SomeProtocol, AnotherProtocol { someMethod() }
クラスの場合はスーパークラスがある場合はその後に,で区切って記述する。
class SomeClass: SuperClass, SomeSuperclass, AnotherProtocol { someMethod() }
Protocols|The Swift Programming Language
extension エクステンション
クラス、構造体、列挙型などに機能を追加して拡張することが出来る。
文法は extension 拡張対象 {} と記載する。
extension String { // 文字列からHTMLタグを取り除くメソッドを追加 func removeHtmlTag() -> String { return replacingOccurrences(of: "<(\"[^\"]*\"|'[^']*'|[^'\">])*>", with: "", options: .regularExpression, range: nil) } } let word = "あい<p>う</p>えお" print(word.removeHtmlTag()) // あいうえお
Closure クロージャ
関数オブジェクトの一種。具体的にはGetting Started with Swift|WWDC2016 とSwift Closure クロージャ記法 いろいろ | タコさんブログ の説明が判りやすい。
let numbers = [4, 17, 34, 41, 82] func divisibleByTwo(_ number: Int) -> Bool { return number % 2 == 0 } let evenNumbers = filterInts(numbers, divisibleByTwo) print(evenNumbers) // [4, 34, 82]
例えば上記のような処理がある場合、divisibleByTwoの部分は以下の様に書くことが出来る。
let evenNumbers = filterInts(numbers,{ (number: Int) -> Bool return number % 2 == 0 }) print(evenNumbers)
さらに省略すると最終的には下記の記法になる。
let evenNumbers = filterInts(numbers) { $0 % 2 == 0 }
さいごに
足りない部分は多々あると思いますが、前編とあわせてこれらをおさえておけば7〜8割くらいはSwiftのコードが読めるようになる?のではと思います。